package com.jxdinfo.hussar.example.Aspect;

import cn.hutool.core.util.ObjectUtil;
import com.jxdinfo.hussar.common.security.BaseSecurityUtil;
import com.jxdinfo.hussar.example.annotation.AutoFil;
import lombok.extern.slf4j.Slf4j;
import lombok.var;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * ClassName: AutoFilAspect
 * Package: com.jxdinfo.hussar.example.Aspect
 * Description:
 *
 * @Author 孙杭
 * @Create 2024/3/25 19:19
 * @Version 1.0
 */
@Component
@Aspect
@Slf4j
public class AutoFillAspect {
    //-----------------------------自定义方法 开始-----------------
    //切入点
    @Pointcut("execution(* com.jxdinfo.hussar.example.base.basedatamanage.mesbasesuppliersh.service.*.*(..))&&@annotation(com.jxdinfo.hussar.example.annotation.AutoFil)")
    public void autoFillPointCut(){

    }
    //-----------------------------自定义方法 结束-----------------

    //-----------------------------自定义方法 开始-----------------
    //消息
    @Before("autoFillPointCut()")
    public void autoFil(JoinPoint joinPoint){
        // 获取方法签名
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        // 获取方法上的注解
        AutoFil annotation = signature.getMethod().getAnnotation(AutoFil.class);

        // 获取注解的成员
        String value = annotation.value();

        // 获取方法参数
        Object[] args = joinPoint.getArgs();

        if(ObjectUtil.isEmpty(args)){
           return;
        }

        Object entity = args[0];
        // 准备数据
        String userName = BaseSecurityUtil.getUser().getUserName();


        try {
            Method getId = entity.getClass().getDeclaredMethod("getId");

            if(ObjectUtil.isNotEmpty(getId.invoke(entity))) {
                Method setCreateBy = entity.getClass().getDeclaredMethod("setCreateBy",String.class);
                setCreateBy.invoke(entity,userName);
            }
            Method setUpdateBy = entity.getClass().getDeclaredMethod("setUpdateBy",String.class);

            setUpdateBy.invoke(entity,userName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
    //-----------------------------自定义方法 结束-----------------
}
